{
 "cells": [
  {
   "cell_type": "markdown",
   "id": "2f7758b7",
   "metadata": {},
   "source": [
    "# 自定义网络模型\n",
    "使用mindspore中的nn模块定义网络模型，其是所有网络的基类，也是网络的基本单元，即在使用中继承`nn.Cell`类，然后重写`__init__`和`construct`方法。\n",
    "\n",
    "我们需要在`__init__`方法中定义有哪些网络层，然后在`construct`方法中排列网络层的结构。\n",
    "\n",
    "在nn模块中，我们有许多网络层的API，下面我们以一个基础的全连接层Dense举例："
   ]
  },
  {
   "cell_type": "code",
   "execution_count": 13,
   "id": "429f132b",
   "metadata": {},
   "outputs": [],
   "source": [
    "import mindspore.nn as nn\n",
    "\n",
    "class MyNet(nn.Cell):\n",
    "    \"\"\"定义网络模型\"\"\"\n",
    "    def __init__(self):\n",
    "        super(MyNet, self).__init__()\n",
    "        self.layer = nn.Dense(1, 1)\n",
    "    \n",
    "    def construct(self, x):\n",
    "        fx = self.layer(x)\n",
    "        return fx"
   ]
  },
  {
   "cell_type": "markdown",
   "id": "839c31f5",
   "metadata": {},
   "source": [
    "`Dense`中的两个参数表示输入和输出tensor的维度，当然它还有其他很多参数，具体可以查看官方文档，这里只是简单模拟自定义网络模型。\n",
    "\n",
    "我们可以使用`matplotlib`可视化训练前的网络模型："
   ]
  },
  {
   "cell_type": "code",
   "execution_count": 12,
   "id": "1437bda1",
   "metadata": {},
   "outputs": [
    {
     "data": {
      "text/plain": [
       "[<matplotlib.lines.Line2D at 0x1b0f622d708>]"
      ]
     },
     "execution_count": 12,
     "metadata": {},
     "output_type": "execute_result"
    },
    {
     "data": {
      "image/png": "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D7BixQpHfz8/P7p168bu3bud+vzwww+0bNmyio9ARESk6q1dWzLc5OUp3FQll69knJyczLBhw+jatSvdu3dn+vTp5Ofnk5iYCMDQoUNp1qwZqampAIwbN47evXvz4osv0q9fPxYuXMjmzZuZPXu24zMnTpxIQkIC11xzDddddx1paWksXbqUtWvXuvpwRERELsiwYTB3rvP2nDmWleO1XB5wEhIS+O2335gyZQpZWVlERUWRlpbmuJA4MzMTX98zA0k9e/ZkwYIFPPbYY0yePJm2bduyZMkSOnbs6Ohzxx13MGvWLFJTU3n44Ydp164d//nPf+jVq5erD0dERKRSjh6Fs+9sXrcOrrnGmnq8ncvXwXFHWgdHRESq03//C/Hxzm35+SXvnJLyuc06OCIiIjXdXXc5h5tRo8y7pBRuXEtPExcREXGB3Fy4+GLntvXroYx7bKSKaQRHRESkii1bVjLcnDihcFOdFHBERESqUL9+5vOjTktONqek9Dzo6qUpKhERkSrw++/QuLFz2+bNEB1tTT01nUZwRERELtAHH5QMNwUFCjdWUsARERG5ANdfDwMHntmePNmckvLzs64m0RSViIhIpeTkwP+vWeuwbRt06WJJOXIWjeCIiIhU0LvvOocbf38oLFS4cScKOCIiIufJMKBHD7jnnjNtTz4JJ09CnTrW1SUlaYpKRETkPBw8CM2aObft2AEdOlhTj5RPIzgiIiLnMGeOc7hp2BBOnVK4cWcKOCIiImUwDOjcGRITz7Q995y55k2tWtbVJeemKSoREZFS7NsHLVo4t+3eDZddZk09UjEawRERETnLG284h5vmzaG4WOHGkyjgiIiI/D+7HS69FB566Ezbyy+bozm++sb0KJqiEhERAf73P7jkkpJtrVtbU49cGOVRERGp8V55xTnctG1rTkkp3HgujeCIiEiNZbeb19f8+uuZtjfegJEjratJqoYCjoiI1Eg//ADt2jm3ZWZCRIQ19UjV0hSViIjUOM895xxuunQxR3MUbryHRnBERKTGKC6Gxo0hN/dM25w5MGyYVRWJqyjgiIhIjfD993D55c5tBw5AeLg19YhraYpKRES83pNPOoebnj3NKSmFG++lERwREfFaRUVQr575z9PefRcGDbKuJqkeCjgiIuKVvvkGoqKc27KzoUkTS8qRaqYpKhER8TqTJzuHm+uv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IhWnXxsREYvt3w9nL8+1axe0a2dNPSLeQCM4IiIW+uc/ncNNWBicOqVwI3KhFHBERCxgGBAZCSNGnGmbNs28wLhWLevqEvEWmqISEalmv/wCrVs7t/38M7RpY0k5Il5JIzgiItVo5kzncNOmDRQXK9yIVDWN4IiIVAO7HVq2NC8oPu2112DUKOtqEvFmCjgiIi7200/Qtq1z29690KKFNfWI1ASaohIRcaEXX3QONx07mqM5CjcirqURHBERFyguhtBQcxXi0956C+6/37qaRGoSBRwRkSq2cyd06ODcduBAyedLiYjraIpKRKQKPf20c7jp3t2cklK4EaleGsEREakCp05BUBAcP36mbf58uOce62oSqckUcERELtB330Hnzs5tWVnmNTgiYg1NUYmIXIDHH3cON9deaz6GQeFGxFoawRERqYTCQvD3d25bvBjuvNOaekTEmQKOiEgFbdkC0dHObb/9Bo0bW1OPiJSkKSoRkQqYONE53Nx0kzklpXAj4l40giMich5OnoS6dZ3bPvoIbrvNmnpEpHwKOCIi57BhA/To4dx2+DBcfLE19YjIuWmKSkSkHGPGOIebAQPMKSmFGxH3phEcEZFSHD8O9eo5t6WlQXy8NfWISMUo4IiInOWLL+Caa5zbbDYIDLSmHhGpOE1RiYj8wQMPOIebe+81p6QUbkQ8i0ZwRESAY8egQQPnttWr4brrrKlHRC6MRnBEpMZbtapkuDl6VOFGxJMp4IhIjTZkCMTFndkeMcKckqpf37qaROTCaYpKRGokmw2Cg53bvvgCevWypBwRqWIawRGRGictrWS4OX5c4UbEmyjgiEiNcscd5vOjTnv4YXNK6uzHMIiIZ9MUlYjUCEeOQMOGzm0bNkD37tbUIyKupREcEfF6H31UMtycPKlwI+LNqiXgzJw5k1atWhEQEEBMTAwbN24st//ixYuJjIwkICCATp06sXz5cqf3DcNgypQpNG3alLp16xIXF8ePP/7oykMQEQ/Vty/0739m+y9/Maek/P0tK0lEqoHLA86iRYtITk5m6tSpbNmyhS5duhAfH09OTk6p/devX8/gwYNJSkpi69at9O/fn/79+7N9+3ZHn+eee45XXnmFWbNmsWHDBurVq0d8fDwnT5509eGIiIc4dAh8fOCzz860bdkCzz5rXU0iUn18DMMwXPkDYmJi6Nat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\n",
      "text/plain": [
       "<Figure size 640x480 with 1 Axes>"
      ]
     },
     "metadata": {},
     "output_type": "display_data"
    }
   ],
   "source": [
    "import mindspore as ms\n",
    "import matplotlib.pyplot as plt\n",
    "import numpy as np\n",
    "\n",
    "# 初始化网络模型\n",
    "net = MyNet()\n",
    "\n",
    "# 获取可训练参数w和b\n",
    "model_params = net.trainable_params()\n",
    "\n",
    "x_model = np.array([-10, 10, 0.1])\n",
    "y_model = x_model * model_params[0].asnumpy()[0] + model_params[1].asnumpy()[0]\n",
    "# asnumpy()返回具有从该数组复制的值的 numpy.ndarray 对象\n",
    "\n",
    "plt.plot(x_model, y_model, color=\"Blue\")"
   ]
  }
 ],
 "metadata": {
  "kernelspec": {
   "display_name": "mindspore",
   "language": "python",
   "name": "mindvision"
  },
  "language_info": {
   "codemirror_mode": {
    "name": "ipython",
    "version": 3
   },
   "file_extension": ".py",
   "mimetype": "text/x-python",
   "name": "python",
   "nbconvert_exporter": "python",
   "pygments_lexer": "ipython3",
   "version": "3.7.5"
  }
 },
 "nbformat": 4,
 "nbformat_minor": 5
}
